home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 2.iso / dist / fw_glimpse.idb / usr / freeware / src / glimpse-3.0 / agrep / putils.c.z / putils.c
C/C++ Source or Header  |  1997-09-09  |  3KB  |  101 lines

  1. /* Copyright (c) 1994 Burra Gopal, Udi Manber.  All Rights Reserved. */
  2.  
  3. #include "agrep.h"
  4.  
  5. int
  6. is_complex_boolean(buffer, len)
  7.     CHAR    *buffer;
  8.     int    len;
  9. {
  10.     int    i = 0;
  11.     CHAR    cur = '\0';
  12.  
  13.     while (i < len) {
  14.         if (buffer[i] == '\\') i+=2;
  15.         else if (buffer[i] == ',') {
  16.             if ((cur == ';') || (cur == '~')) return 1;
  17.             else cur = ',';
  18.             i++;
  19.         }
  20.         else if (buffer[i] == ';') {
  21.             if ((cur == ',') || (cur == '~')) return 1;
  22.             else cur = ';';
  23.             i++;
  24.         }
  25.         /* else if ((buffer[i] == '~') || (buffer[i] == '{') || (buffer[i] == '}')) { */
  26.         else if (buffer[i] == '~') {
  27.             /* even if pattern has just ~s... user must use -v option for single NOT */
  28.             return 1;
  29.         }
  30.         else i++;
  31.     }
  32.     return 0;
  33. }
  34.  
  35. /* The possible tokens are: ; , a e ~ { } */
  36. int
  37. get_token_bool(buffer, len, ptr, tokenbuf, tokenlen)
  38.     CHAR    *buffer, *tokenbuf;
  39.     int    len, *ptr, *tokenlen;
  40. {
  41.     if ((*ptr>=len) || (buffer[*ptr] == '\n') || (buffer[*ptr] == '\0')) return 'e';
  42.     while ((*ptr<len) && (buffer[*ptr] != '\n') && (buffer[*ptr] != '\0') && ((buffer[*ptr] == ' ') || (buffer[*ptr] == '\t'))) (*ptr)++;
  43.     if ((*ptr>=len) || (buffer[*ptr] == '\n') || (buffer[*ptr] == '\0'))  return 'e';
  44.     if ((buffer[*ptr] == ',') || (buffer[*ptr] == ';') || (buffer[*ptr] == '~') || (buffer[*ptr] == '{') || (buffer[*ptr] == '}')) {
  45.         tokenbuf[0] = buffer[*ptr];
  46.         *tokenlen = 1;
  47.         return buffer[(*ptr)++];
  48.     }
  49.     *tokenlen = 0;
  50.     if (buffer[*ptr] == '\\') {
  51.         tokenbuf[(*tokenlen)++] = buffer[(*ptr)++];
  52.         tokenbuf[(*tokenlen)++] = buffer[(*ptr)++];
  53.     }
  54.     else tokenbuf[(*tokenlen)++] = buffer[(*ptr)++];
  55.     while (    (*ptr<len) && (buffer[*ptr] != '\n') && (buffer[*ptr] != '\0') &&
  56.         (buffer[*ptr] != ',') && (buffer[*ptr] != ';') && (buffer[*ptr] != '~') && (buffer[*ptr] != '{') && (buffer[*ptr] != '}')) {
  57.         if (buffer[*ptr] == '\\') {
  58.             tokenbuf[(*tokenlen)++] = buffer[(*ptr)++];
  59.             tokenbuf[(*tokenlen)++] = buffer[(*ptr)++];
  60.         }
  61.         else tokenbuf[(*tokenlen)++] = buffer[(*ptr)++];
  62.     }
  63.     tokenbuf[*tokenlen] = '\0';
  64.     return 'a';
  65.     /* It will return next 'e' next time if we broke out of the loop because (*ptr >= len) */
  66. }
  67.  
  68. void
  69. print_tree(t, level)
  70.     ParseTree *t;
  71. {
  72.     int    i;
  73.  
  74.     if (t == NULL) printf("NULL");
  75.     else if (t->type == LEAF) {
  76.         for (i=0; i<level; i++) printf("  ");
  77.         printf("LEAF %x %x %s\n", t->op, t->terminalindex, t->data.leaf.value);
  78.     }
  79.     else if (t->type == INTERNAL) {
  80.         if (t->data.internal.left != NULL) print_tree(t->data.internal.left, level + 1);
  81.         for (i=0; i<level; i++) printf("  ");
  82.         printf("INTERNAL %x\n", t->op);
  83.         if (t->data.internal.right != NULL) print_tree(t->data.internal.right, level + 1);
  84.     }
  85. }
  86.  
  87. void
  88. destroy_tree(t)
  89.     ParseTree *t;
  90. {
  91.     if (t == NULL) return;
  92.     if (t->type == LEAF) {
  93.         free(t->data.leaf.value);    /* t itself should not be freed: static allocation */
  94.     }
  95.     else if (t->type == INTERNAL) {
  96.         if (t->data.internal.left != NULL) destroy_tree(t->data.internal.left);
  97.         if (t->data.internal.right != NULL) destroy_tree(t->data.internal.right);
  98.         free(t);
  99.     }
  100. }
  101.